package kr.pe.johnkim.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.util.EncodingUtils;

import kr.pe.johnkim.sendme.provider.SendMeCertification;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.provider.SendMeMember;
import kr.pe.johnkim.sendme.rest.SendMeCertificationRest;
import kr.pe.johnkim.sendme.rest.SendMeInstallRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.rest.SendMeMemberRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.View.OnClickListener;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class SendMeWebViewActivity extends Activity {

	public static String TAG = SendMeWebViewActivity.class.getSimpleName();


	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();

	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;
	
	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";
	
	// 웹뷰 관련
	String loadingURL = "";
	String isGetMethod = "";
	String webViewTitle = "";
	String postData;
	String parentType = "";		
	
	// 타이틀 뷰
	TextView webViewTitleTxt;
	// 타이틀 레이아웃
	View titleViewLayout;
//	// 정적 웹뷰
//	WebView webv;   //webv <-> wv
	
	// 동적 웹뷰
	LinearLayout contents;
	WebView wv;
	
	// 반투명 배경
	ImageView webViewBg;

	// 프로그래스바(로딩 표시)
	private ProgressDialog dialog;

	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 106;		

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 107;


	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);

		setContentView(R.layout.activity_send_me_webview);

		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);

		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);

		// 뒤로 가기 화살표 버튼을 설정 한다.
				imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
				imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						
						// 이전 화면
						if(parentType!=null && parentType.length()>0){
							if(parentType.equals("settings")){
								Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
								startActivity(intent);
							}else if(parentType.equals("servicePolicy")){
								Intent intent = new Intent(returnThis(), SendMeSubSettingsServicePolicyActivity.class);
								startActivity(intent);
							}
						}
						
						// 화면을 닫는다.
						sendMeActivityManager.removeActivity(SendMeWebViewActivity.this);
						finish();
					}
				});

				// 타이틀바의 메인 메뉴 버튼을 설정 한다.
				imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
				imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						Log.i(TAG, "pressed top main menu.");

						// 메인 메뉴 화면을 출력 한다.
						Intent i = new Intent(SendMeWebViewActivity.this, SendMeMainMenuActivity.class);
						startActivity(i);
						
						// 화면을 닫는다.
						sendMeActivityManager.removeActivity(SendMeWebViewActivity.this);
						finish();
					}
				});
				
				
		Intent rIntent = getIntent();
		loadingURL = rIntent.getStringExtra("loadingURL");			// URL 정보를 받음.
		isGetMethod = rIntent.getStringExtra("isGetMethod");			
		webViewTitle = rIntent.getStringExtra("webViewTitle");			
		parentType = rIntent.getStringExtra("parentType");	
		
		webViewTitleTxt = (TextView) findViewById(R.id.webViewTitleTxt);
		webViewTitleTxt.setText(webViewTitle);
		
		webViewBg = (ImageView) findViewById(R.id.webViewBg);
		webViewBg.setAlpha(0.5f);
		
		
//		webv = (WebView) findViewById(R.id.webv);
		titleViewLayout = findViewById(R.id.titleViewLayout);
		
		contents = (LinearLayout) findViewById(R.id.webview_linear_layout);
		wv = new WebView(this);
		 // 웹뷰 전체화면 만들기
        wv.setLayoutParams( new LayoutParams(LayoutParams.MATCH_PARENT , LayoutParams.MATCH_PARENT));
		
		//		wv.addJavascriptInterface(new AndroidBridge(), "hybrid");
		wv.getSettings().setJavaScriptEnabled(true);		 // JavaScript 허용.
		wv.setWebViewClient(new MyWebViewClient());  // WebViewClient 지정       
		wv.setWebChromeClient(new MyWebChromeClient());
		
		contents.addView(wv);

		confirmNotification();
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
		if(loadingURL.length()>0){
			//			postData = "Merchant-Language="+strLanguage+"&Merchant-Country="+strCountry;	
			postData = "";

			// get 방식
			if(isGetMethod!=null && isGetMethod.equals("true")){
				Log.d(TAG,"use get method");
				wv.loadUrl(loadingURL);
				
				// post 방식	
			}else{
				wv.postUrl(loadingURL, EncodingUtils.getBytes(postData, "BASE64"));
			}
		}else{
			Toast.makeText(SendMeWebViewActivity.this, "요청한 주소를 찾을 수 없습니다.", Toast.LENGTH_SHORT).show();
			finishWebViewActivity();
		}

	}



	@Override 
	public boolean onKeyDown(int keyCode, KeyEvent event) { 
		return super.onKeyDown(keyCode, event);
	};




	/**
	 * Handler 를 정의 한다.
	 * 모든 Thread 를 등록해 놓고 호출 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				if(dialog==null){
					dialog = ProgressDialog.show(SendMeWebViewActivity.this, "", "Load..", true);	 
				}else if(!dialog.isShowing()){
					dialog.show();
				}
				break;
				// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.dismiss();
				break;


			}
		}
	};



	/**
	 * MyWebViewClient
	 * 페이지 로드, 완료 이벤트발생 가능한 웹뷰 클라이언트
	 *
	 */
	private class MyWebViewClient extends WebViewClient {
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			// 마켓 링크 연결
			if(url.contains("market://")){
				Uri uri = Uri.parse(url);  	// ex)"market://details?id=kr.co.bettersoft.checkmileage.activities"
				Intent it = new Intent(Intent.ACTION_VIEW, uri);  
				startActivity(it) ;
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeWebViewActivity.this);
				finish();
			}else{
				// 일반
				view.loadUrl(url);
			}
			return true;
		}
		/**
		 * onPageStarted
		 * 웹뷰 로딩 시작하면 시간 재서 로딩 안되면 멈추고 알린다.
		 *
		 * @param view
		 * @param url
		 * @param favicon
		 * @return
		 */
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			showPb();
		}
		/**
		 * onPageFinished
		 * 로딩 끝나면 프로그래스바 숨기고 재로딩 가능하도록한다
		 *
		 * @param view
		 * @param url
		 * @return
		 */
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			titleViewLayout.setVisibility(View.VISIBLE);
			hidePb();
		}
	}


	/**
	 * WebChromeClient 를 상속하는 클래스이다.
	 * alert 이나 윈도우 닫기 등의 web 브라우저 이벤트를 구하기 위한 클래스이다.
	 * @author johnkim
	 */
	private class MyWebChromeClient extends WebChromeClient {
		//Javascript alert 호출 시 실행
		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			final JsResult finalRes = result;
			//AlertDialog 생성
			new AlertDialog.Builder(view.getContext())
			.setMessage(message)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finalRes.confirm(); 
				}
			})
			.setCancelable(false)
			.create()
			.show();
			return true;
		}
	}

	/**
	 * Bridge Class
	 * 
	 */
	private class AndroidBridge {
		//		// 종료
		//		public void finishActivity(){
		//			Log.d(TAG,"finish called");
		//			handler.post(new Runnable() {
		//				public void run() {
		//					//					mWeb.stopLoading();
		//					finish();
		//				}
		//			});
		//		}
	}
	///////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버통신
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸

	public Context returnThis(){
		return this;
	}

	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
	}

	/**
	 * onStop
	 *  액티비티 정지할때 웹뷰 로딩도 정지한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onStop(){
		if(wv!=null){
			runOnUiThread(new Runnable(){
				public void run(){
					wv.stopLoading();	
				}
			});
		}
		super.onStop();
	}

	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);

		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		
//		Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
//		startActivity(intent);
		
		// 이전 화면
		if(parentType!=null && parentType.length()>0){
			if(parentType.equals("settings")){
				Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
				startActivity(intent);
			}else if(parentType.equals("servicePolicy")){
				Intent intent = new Intent(returnThis(), SendMeSubSettingsServicePolicyActivity.class);
				startActivity(intent);
			}
		}
		
		finishWebViewActivity();
	}
	
	/**
	 * 액티비티 종료하기
	 */
	public void finishWebViewActivity(){
		sendMeActivityManager.removeActivity(this);
		finish();
	}

}
